package model.ladron;

import java.util.ArrayList;
import java.util.Random;

import model.Partida;
import model.lugares.Ciudad;
import model.lugares.Edificio;
import model.parser.FachadaParser;
import model.parser.pistas.IParseadorPistas;

public abstract class CreadorDeEstrategiaDeEscape {

	protected int cantidadDeLugaresAEscapar;
	protected FachadaParser parser = Partida.getParser();
	protected IParseadorPistas parserPistas;
	private ArrayList<Integer> numerosDeCiudades;
	private int cantidadDeCiudadesDisponibles = parser.getCantidadCiudades();
	
	
	public EstrategiaDeEscape posibleEstrategiaDeEscape(Ciudad primeraCiudadObligatoria) {
		
		numerosDeCiudades = numerosAleatoreosNoRepetidosDeCiudades(primeraCiudadObligatoria);
		ArrayList<Ciudad> ciudadesAHuir = new ArrayList<Ciudad>(cantidadDeLugaresAEscapar+1); //le sumo 1 por la ciudad primera
		ciudadesAHuir.add(primeraCiudadObligatoria);
		
		for(int j=1;j<cantidadDeLugaresAEscapar+1;j++){
			ciudadesAHuir.add(parser.getCiudadNumero(numerosDeCiudades.get(j)));		
		}
		ciudadesAHuir = agregarPistasACiudades(ciudadesAHuir);
		Edificio edificioFinal = ciudadesAHuir.get(cantidadDeLugaresAEscapar).getEdificioAlAzar();
		EstrategiaDeEscape estrategiaDeEscapeDelLadron = new EstrategiaDeEscape(ciudadesAHuir, edificioFinal);
				
		return estrategiaDeEscapeDelLadron;

	}
	
	private ArrayList<Integer> numerosAleatoreosNoRepetidosDeCiudades(Ciudad primeraCiudadObligatoria){
		Random rdm = new Random();
		ArrayList<Integer> numsAleatorios = new ArrayList<Integer>(cantidadDeLugaresAEscapar-1);
				
		for(int i = 0; i<cantidadDeLugaresAEscapar+1;i++){
			int h = rdm.nextInt(cantidadDeCiudadesDisponibles); //maxima cantidad de ciudades
			while (numsAleatorios.contains(h) || parser.getCiudadNumero(h).compareTo(primeraCiudadObligatoria)==0)
				h = rdm.nextInt(cantidadDeCiudadesDisponibles);
			numsAleatorios.add(h);
		}
		return numsAleatorios;
	}
	
	private ArrayList<Ciudad> agregarPistasACiudades(ArrayList<Ciudad> ciudades) {
		Ciudad unaCiudad;
		Ciudad laProxima;
		for (int i = 1; i<cantidadDeLugaresAEscapar+1; i++){
			unaCiudad = ciudades.get(i-1);
			laProxima = ciudades.get(i);
			for (Edificio edif : unaCiudad.getEdificios())
				edif.agregarPista(parserPistas.obtenerPistaDeLaCiudadDeLaTematica(laProxima, edif.getTematica()));
			/*unaCiudad.getEdificios().get(Ciudad.INDEX_E_MONEDA).agregarPista(parserPistas.obtenerPistaDeMonedaDeLaCiudad(laProxima));
			unaCiudad.getEdificios().get(Ciudad.INDEX_E_PUBLICO).agregarPista(parserPistas.obtenerPistaDeBibliotecaDeLaCiudad(laProxima));
			unaCiudad.getEdificios().get(Ciudad.INDEX_E_TRANSPORTE).agregarPista(parserPistas.obtenerPistaDeTrasporteDeLaCiudad(laProxima));
			*/
		}
		return ciudades;
	}
	
}
